# 命名规范
代码的注释不是越详细越好。实际上好的代码本身就是注释,我们要尽量规范和美化自己的代码来减少不必要的注释。若编程语言足够有表达力,就不需要注释,尽量通过代码来阐述。——《Clean Code》
良好的命名,可以增强代码的可读性、减少阅读代码的成本,是程序最好的注释。相反,没有规则甚至是和代码内容不匹配的命名,会大大增加我们阅读代码的成本,甚至会误导我们的思维,导致对代码的理解完全错误,后患无穷。
不知道你们有没有碰到过“坑队友”,反正我是碰到过使用 a、b、c、d……魔法命名变量的。就两个字:看不懂!这种代码就是一次性代码,后面接手的人完全维护不了(不要说别人,就算是本人,过个半个月再去开发,也很难想起来这变量的作用了吧)。
一个优秀的程序员肯定是要能书写可维护的代码,而不是处处有坑的一次性代码。最重要的一点就需要规范命名。
# 命名方法
我们先来介绍几个在编程时国际通用的、不区分国界、不区分语言的命名方法~
- 小驼峰命名法(lowerCamelCase) :第一个单词以小写字母开始,第二个单词的首字母大写,例如:firstName、lastName。
- 大驼峰命名法(CamelCase) :每一个单词的首字母都采用大写字母,例如:FirstName、LastName。
- 匈牙利命名法(HN case) :基本原则为:变量名 = 属性 + 类型 + 对象描述。
- 下划线命名法(snake_case):下划线命名法也叫蛇形法,全由小写字母和下划线组成,在两个单词之间用下滑线连接。例如:first_name。
- 中划线命名法(kebab-case):中划线命名法也叫串式命名法,各个单词之间通过下划线“-”连接。例如:first-name。
命名方法是我们命名的基础,我们需要在不同的场景约定好使用哪一种命名方式,比如给文件资源命名通常使用中划线命名法(kebab-case)、JS 中的变量通常使用小驼峰方式(lowerCamelCase),TS 中的类型通常使用大驼峰方式(CamelCase)、CSS 属性名使用中划线命名法(kebab-case)等。
# 文件资源命名
对文件资源合适命名,可以让你自己合小组成员能够方便理解每一个文件的用途。通常文件资源命名常遵循以下原则。
- 文件名不得含有空格。
- 正例:hello-world
- 反例:hello world
- 文件名建议只使用小写字母,不使用大写字母。(为了醒目,某些说明文件的文件名,可以使用大写字母,比如 README、LICENSE。)
- 正例:hello-world
- 反例:HelloWorld
- 文件名包含多个单词时,单词之间建议使用半角的连词线 ( - ) 分隔。
- 正例:hello-world
- 反例:hello_world
- 有复数结构式,要使用复数。
- 正例:services
- 反例:service
例外的是,在 linux 系统文件中推荐的文件名命名一般是使用下划线的形式。同时在 linux 系统中,是区分文件的大小写的,在 Window、OS中是不区分大小写的。(但是推荐区分大小写的方式, 因为你不知道你的代码未来将在哪里运行,比如很常见的例子,平时开发使用的是 Mac OS 不区分大小写,但是在远端 CI\CD 的时候使用的是 linux,经常会因为大小写的问题导致构建失败。)保持良好的习惯才能减少麻烦~~
# 布尔值
命名方式:小驼峰方式。
命名规则:前缀为判断性动词。
| 动词 | 含义 | 值 |
|---|---|---|
| has | 判断是否含有某个值 | true:含有此值; false:不含有此值 |
| is | 判断是否为某个值 | true:为某个值; false:不为某个值 |
使用判断性动词作为前缀会让代码更好理解,通过名称就判断出该变量为布尔值。
# 函数
命名方式:小驼峰方式(构造函数使用大驼峰命名法)。
命名规则:前缀为动词。
| 动词 | 含义 |
|---|---|
| can | 判断是否可执行某个动作 |
| on | 监听事件的回调 |
| handle | 处理事件 |
| get | 获取某个值 |
| set | 设置某个值 |
还有一些比如 complete、calculate、compute 这些就不一一介绍了,使用动词作为函数的前缀主要是让函数名称变得更加有描述性,容易理解。
# 常量
命名方法:全部大写。
命名规范:使用大写字母和下划线来组合命名,下划线用以分割单词。
例如:USER_NAME、PHONE_NUMBER。
# 类的成员
- 公共属性和方法:同变量命名方式。
- 私有属性和方法:前缀为下划线
(_)后面跟公共属性和方法一样的命名方式。
例如:
function Student(name) {
var _name = name; // 私有成员
// 公共方法
this.getName = function () {
return _name;
}
// 公共方式
this.setName = function (value) {
_name = value;
}
}
var st = new Student('tom');
st.setName('jerry');
console.log(st.getName()); // => jerry:输出_name私有变量的值
在起名称的时候,应该本着描述性以及唯一性这两大特性来命名,才能保证资源之间不冲突,并且每一个都便于记忆。命名规则要望文知义,简单明了。
# 踩坑纸杯
命名方法只能让我们从形式上进行格式的统一,方便我们搜索代码。怎么才能起一个好名字,需要长期的观察和实践,下面我整理了一些命名时的小 tips。
- 尽量不要缩写、简写的单词。(除了 template => tmp、message => msg、image => img、component => comp、property => prop 这些单词已经被公认的缩写。)
- 正例:FirstName
- 反例:FN。
- 缩写的规则采用国际惯用方法:
- 元音字母剔除法,首字母除外;
- 使用单词的头一个或几个字母。
- 可读性强的命名优先于简短的命名。
- 命名长度最好在 20 个字符以内,避免多长带来的阅读不便。
- 命名要有具体的含义,避免使用一些泛指和无具体含义的词。
- 正例:student;
- 反例:something
